import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

let lifeData = {}

// 尝试获取本地是否存在lifeData变量，第一次启动时不存在
try {
  lifeData = uni.getStorageSync('lifeData')
} catch(e) {
  
}

// 标记需要永久存储的变量，在每次启动时取出，在state中的变量名
let saveStateKeys = ['vuex_user','userInfo','sessionId','token']

// 保存变量到本地存储
const saveLifeData = function(key, value) {
  // 判断变量是否在存储数组中
  if (saveStateKeys.indexOf(key) != -1) {
    // 获取本地存储的lifeData对象，将变量添加到对象中
    let tmpLifeData = uni.getStorageSync('lifeData')
    // 第一次启动时不存在，则放一个空对象
    tmpLifeData = tmpLifeData ? tmpLifeData : {},
    tmpLifeData[key] = value
    // 将变量再次放回本地存储中
    uni.setStorageSync('lifeData', tmpLifeData)
  }
}

/**
 * 将storage中缓存的数据重新写入store中，防止由于刷新页面导致数据丢失的问题
 */
const storeRewrite = store => {
	store.subscribe((mutation,state)=>{
		let tmpLifeData = uni.getStorageSync('lifeData');
		Object.keys(tmpLifeData).forEach(key => {
			state[key] = tmpLifeData[key];
		})
	})
}

const store = new Vuex.Store({
  state: {
    // 如果上面从本地获取的lifeData对象下有对应的属性，就赋值给state中对应的变量
    // 加上vuex_前缀，是防止变量名冲突，也让人一目了然
    vuex_user: lifeData.vuex_user ? lifeData.vuex_user : {name: '图鸟'},
    // 如果vuex_version无需保存到本地永久存储，无需lifeData.vuex_version方式
    // app版本
    vuex_version: "1.0.0",
    // 是否使用自定义导航栏
    vuex_custom_nav_bar: true,
    // 状态栏高度
    vuex_status_bar_height: 0,
    // 自定义导航栏的高度
    vuex_custom_bar_height: 0,
	// Token令牌
    token: null,
	// 用户登录后的信息
	userInfo:{
		coin: 0,
		email: null,
		id: null,
		integral: 0,
		nickname: "",
		phoneNumber: "",
		rmb: 0,
		role: "",
		sex: "",
		status: "",
		userName: "",
		avatar: ""
	},
	sessionId: null,
	defaultAvatarUrl:"https://thirdwx.qlogo.cn/mmopen/vi_32/POgEwh4mIHO4nibH0KlMECNjjGxQUq24ZEaGT4poC6icRiccVGKSyXwibcPq4BWmiaIGuG1icwxaQX6grC9VemZoJ8rg/132"
  },
  mutations: {
    $tStore(state, payload) {
      // 判断是否多层调用，state中为对象存在的情况，例如user.info.score = 1
      let nameArr = payload.name.split('.')
      let saveKey = ''
      let len = nameArr.length
      if (len >= 2) {
        let obj = state[nameArr[0]]
        for (let i= 1; i < len - 1; i++) {
          obj = obj[nameArr[i]]
        }
        obj[nameArr[len - 1]] = payload.value
        saveKey = nameArr[0]
      } else {
        // 单层级变量
        state[payload.name] = payload.value
        saveKey = payload.name
      }
      
      // 保存变量到本地中
      saveLifeData(saveKey, state[saveKey])
    },
	updateUserInfo(state, userInfo){
		Object.keys(state.userInfo).forEach(key => {
			if (userInfo[key]){
				state.userInfo[key] = userInfo[key]
			}
		});
		saveLifeData('userInfo', state.userInfo)
	},
	logout(state){
		state.token = null;
		state.sessionId = null;
		Object.keys(state.userInfo).forEach(key => {
			state.userInfo[key] = null;
		});
		let tmpLifeData = uni.getStorageSync('lifeData');
		tmpLifeData.userInfo = state.userInfo;
		tmpLifeData.sessionId = null;
		uni.setStorageSync('lifeData',tmpLifeData);
	}
  },
  actions: {
  },
  getters:{
	  getDefaultAvatar(state){
		  return state.defaultAvatarUrl;
	  }
  },
  plugins:[storeRewrite]
})
export default store